package com.atguigu.yygh.hosp.controller;

import com.atguigu.yygh.hosp.globalexp.YyghException;
import com.atguigu.yygh.hosp.result.R;
import com.atguigu.yygh.hosp.result.ResultCode;
import com.atguigu.yygh.hosp.service.HospitalSetService;
import com.atguigu.yygh.model.hosp.HospitalSet;
import com.atguigu.yygh.vo.hosp.HospitalSetQueryVo;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.*;
@Api("医院设置模块接口")  //描述类的作用
//@CrossOrigin
@Slf4j
@RestController
@RequestMapping("/admin/hosp/hospitalSet")
public class HospitalSetController {
    @Autowired
    HospitalSetService hospitalSetService;


    /**
     * 从医院设置表中,根据hoscode查询该医院的接口地址
     * @return
     */
    @GetMapping("/getApiUrl/{hoscode}")
    public String getApiUrl(@PathVariable String hoscode){

        return hospitalSetService.getApiUrl(hoscode);

    }

    @ApiOperation(value = "测试日志接口")
    @GetMapping("/testLog")
    public R testLog(){
        //打印不同级别的日志
        log.error("这是一条error级别的日志");
        log.warn("这是一条warn级别的日志");
        log.info("info级别的日志");
        return R.ok();
    }

    /**
     * 查询所有的医院设置
     * @return
     */
    @ApiOperation(value = "查询所有的医院设置")
    @GetMapping("/findAll")
    public R findAll(){
        //业务数据,放在r对象的data属性中 key=list value=集合
        List<HospitalSet> list = hospitalSetService.list();
        Map<String, Object> map=new HashMap<>();
        map.put("list",list);
        map.put("total",list.size());
        return R.ok().data(map).data("count",123).message("查询所有医院设置成功").success(false).code(20005); //续期: 返回格式{code,success,message,data:{list:list}}
//        R ok=R.ok();
//        ok.getData().put("list",list);
//        return ok;

    }

    /**
     * 根据医院设置主键查询,业务数据存放在data中的item
     */
    @ApiOperation(value = "根据医院设置主键查询")
    @GetMapping("/getById/{id}")
    public R getById(@ApiParam(value = "医院设置的id")@PathVariable Long id){

        HospitalSet hospitalSet = hospitalSetService.getById(id);
        if(hospitalSet==null){
            throw new YyghException(ResultCode.ERROR,"该医院设置不存在");
        }
        return R.ok().data("item",hospitalSet);
    }

    @ExceptionHandler(value = YyghException.class)
    public R handlerYyghException(YyghException exp){
        //return R.error.message("自定义异常"+exp.getMessage());默认的异常信息
        log.error(exp.getYygh_message());
        return R.error().message("自定义异常"+exp.getYygh_message());//自定义的异常信息
    }

    /**
     * 开通医院设置,传递的参数hosname,hoscode,apiUrl,signKey,contactsName,contactsPhone,status
     * 并且格式为json
     * 需求:为当前医院设置赋予status的默认值=1(正常状态),并且创建时间和最后修改时间字段需要赋值默认值
     */
    @ApiOperation(value = "开通医院设置")
    @PostMapping("/saveHospitalSet")
    public R saveHospitalSet(@ApiParam(value = "医院设置参数")@RequestBody HospitalSet hospitalSet){
        //1.参数的非空校验,填写的医院编号,医院状态不能为空
        if(StringUtils.isEmpty(hospitalSet.getHoscode())){
            throw new YyghException(ResultCode.ERROR,"医院编号不能为空");
        }
        if(StringUtils.isEmpty(hospitalSet.getHosname())){
            throw new YyghException(ResultCode.ERROR,"医院编号不能为空");
        }
        //2.为当前hospitalSet对象赋值status=1(默认值)
        hospitalSet.setStatus(1);
        //3.创建时间和更新时间(表中设计了默认值,可以不用写)
        hospitalSet.setCreateTime(new Date());
        hospitalSet.setUpdateTime(new Date());

        //4.判断传递过来的医院编号是否已将存在
        String hoscode = hospitalSet.getHoscode();
        //获取到医院编号
        QueryWrapper<HospitalSet> queryWrapper=new QueryWrapper<>();
        //创建构建查询条件,<>中的泛型类型HospitalSet表示要查询的实体类类型，即医院设置实体类。
        queryWrapper.eq("hoscode", hoscode);
        List<HospitalSet> list = hospitalSetService.list(queryWrapper);
        if(list.size()>0){
            //说明医院编号已经存在
            throw new YyghException(ResultCode.ERROR,"医院编号hoscode已经存在");
        }

        //5.调用service方法完成添加
        boolean save = hospitalSetService.save(hospitalSet);
        return save?R.ok().message("开通成功"):R.error().message("开通失败");
    }

    /**
     * 医院设置的锁定和解锁
     * @param id
     * @param status
     * @return
     */
    @ApiOperation(value = "医院设置的锁定和解锁")
    @GetMapping("/updateStatus/{id}/{status}")
    public R updateStatus(@ApiParam(value = "医院设置的id") @PathVariable Long id,
                          @ApiParam(value = "医院设置的状态") @PathVariable Integer status){
        //1.查询该医院设置是否存在
        HospitalSet hospitalSet = hospitalSetService.getById(id);
        if(hospitalSet==null){
            throw new YyghException(ResultCode.ERROR,"该医院设置不存在");
        }

        //2.判断是否重复操作
        if(hospitalSet.getStatus()==status){
            throw new YyghException(ResultCode.ERROR,"重复操作");
        }
        //3.判断Status的取值范围
        if(status!=0 && status!=1){
            throw new YyghException(ResultCode.ERROR,"医院设置的状态取值范围不正确");
        }
        //4.根据id修改Status的值
        hospitalSet.setStatus(status);
        hospitalSet.setUpdateTime(new Date());
        boolean b = hospitalSetService.updateById(hospitalSet);
        return b?R.ok():R.error();
    }

    /**
     * 根据医院设置的id来删除数据
     */
    @ApiOperation(value = "根据医院设置的id来删除数据")
    @DeleteMapping("/deleteById/{id}")
    public R deleteById(@ApiParam(value = "医院设置的id") @PathVariable Long id){
        boolean b = hospitalSetService.removeById(id);
        return b?R.ok().message("删除成功"):R.error().message("删除失败");
    }

    /**
     * 根据id进行批量删除
     */
    @ApiOperation(value = "根据id进行批量删除")
    @PostMapping("deleteByIds")
    public R deleteByIds(@RequestBody List<Long> ids){
        boolean b = hospitalSetService.removeByIds(ids);
        return b?R.ok().message("删除成功"):R.error().message("删除失败");
    }

    /**
     * 修改医院设置
     * 根据主键更新HospitalSet
     * 需求:
     *   1.必要参数的非空校验
     *   2.根据id进行更新
     */
    @ApiOperation(value = "修改医院设置")
    @PostMapping("/updateHospset")
    public R updateHospset(@RequestBody HospitalSet hospitalSet){
        //1.必要参数的非空校验 例如id不能为空
        if(StringUtils.isEmpty(hospitalSet.getId())){
            throw new YyghException(ResultCode.ERROR,"修改医院设置时,主键必传");
        }
        //根据id更新
        boolean b = hospitalSetService.updateById(hospitalSet);
        return b?R.ok().message("更新成功"):R.error().message("更新失败");

    }

    /**
     * 条件分页查询
     * 需求:查询条件会有hoscode=  hosname(like),分页查询
     * 返回值:data{rows:当前页的结果集,total:总记录数}
     * 1.封装分页参数 new Page
     * 2.查询条件 new QueryWrapper
     *   对查询条件值进行非空校验,如果不为空,才会拼接查询条件
     */

    @ApiOperation(value = "医院设置列表的带条件的分页查询")
    @PostMapping("/pageQuery/{pageNum}/{pageSize}")
    public R pageQuery(@ApiParam(value = "查询第几页,从1开始",name = "pageNum") @PathVariable Integer pageNum,
                       @ApiParam(value = "每页显示多少条",name = "pageSize")@PathVariable Integer pageSize,
                       @RequestBody HospitalSetQueryVo hospitalSetQueryVo){
       //1.封装分页参数
        Page<HospitalSet> hospitalSetPage = new Page<>(pageNum, pageSize);

        //2.查询条件
        QueryWrapper<HospitalSet> wrapper = new QueryWrapper<>();
        String hoscode = hospitalSetQueryVo.getHoscode();
        String hosname = hospitalSetQueryVo.getHosname();

        //3.对查询条件值非空校验,如果不为空,才会拼接这个查询条件
        if(!StringUtils.isEmpty(hoscode)){
            wrapper.eq("hoscode",hoscode);
        }
        if(!StringUtils.isEmpty(hosname)){
            wrapper.like("hosname",hosname);
        }

        //4.调用mp中的page方法
        hospitalSetService.page(hospitalSetPage,wrapper);

        //5.解析返回值rows:当前页结果集 total:总记录数
        List<HospitalSet> records = hospitalSetPage.getRecords();
        long total = hospitalSetPage.getTotal();

        //6.返回
        return R.ok().data("rows",records).data("total",total);
    }
}
